package protocol

// Features holds all variables for the exchanges supported features
// for a protocol (e.g REST or Websocket)
type Features struct {
	TickerBatching                    bool `json:"tickerBatching,omitempty"`
	AutoPairUpdates                   bool `json:"autoPairUpdates,omitempty"`
	AccountBalance                    bool `json:"accountBalance,omitempty"`
	CryptoDeposit                     bool `json:"cryptoDeposit,omitempty"`
	CryptoWithdrawal                  bool `json:"cryptoWithdrawal,omitempty"`
	FiatWithdraw                      bool `json:"fiatWithdraw,omitempty"`
	GetOrder                          bool `json:"getOrder,omitempty"`
	GetOrders                         bool `json:"getOrders,omitempty"`
	CancelOrders                      bool `json:"cancelOrders,omitempty"`
	CancelOrder                       bool `json:"cancelOrder,omitempty"`
	SubmitOrder                       bool `json:"submitOrder,omitempty"`
	SubmitOrders                      bool `json:"submitOrders,omitempty"`
	ModifyOrder                       bool `json:"modifyOrder,omitempty"`
	DepositHistory                    bool `json:"depositHistory,omitempty"`
	WithdrawalHistory                 bool `json:"withdrawalHistory,omitempty"`
	TradeHistory                      bool `json:"tradeHistory,omitempty"`
	UserTradeHistory                  bool `json:"userTradeHistory,omitempty"`
	TradeFee                          bool `json:"tradeFee,omitempty"`
	FiatDepositFee                    bool `json:"fiatDepositFee,omitempty"`
	FiatWithdrawalFee                 bool `json:"fiatWithdrawalFee,omitempty"`
	CryptoDepositFee                  bool `json:"cryptoDepositFee,omitempty"`
	CryptoWithdrawalFee               bool `json:"cryptoWithdrawalFee,omitempty"`
	TickerFetching                    bool `json:"tickerFetching,omitempty"`
	KlineFetching                     bool `json:"klineFetching,omitempty"`
	TradeFetching                     bool `json:"tradeFetching,omitempty"`
	OrderbookFetching                 bool `json:"orderbookFetching,omitempty"`
	AccountInfo                       bool `json:"accountInfo,omitempty"`
	FiatDeposit                       bool `json:"fiatDeposit,omitempty"`
	DeadMansSwitch                    bool `json:"deadMansSwitch,omitempty"`
	FundingRateFetching               bool `json:"fundingRateFetching"`
	PredictedFundingRate              bool `json:"predictedFundingRate,omitempty"`
	Subscribe                         bool `json:"subscribe,omitempty"`
	Unsubscribe                       bool `json:"unsubscribe,omitempty"`
	AuthenticatedEndpoints            bool `json:"authenticatedEndpoints,omitempty"`
	MessageCorrelation                bool `json:"messageCorrelation,omitempty"`
	MessageSequenceNumbers            bool `json:"messageSequenceNumbers,omitempty"`
	CandleHistory                     bool `json:"candlehistory,omitempty"`
	MultiChainDeposits                bool `json:"multiChainDeposits,omitempty"`
	MultiChainWithdrawals             bool `json:"multiChainWithdrawals,omitempty"`
	MultiChainDepositRequiresChainSet bool `json:"multiChainDepositRequiresChainSet,omitempty"`
	// HasAssetTypeAccountSegregation is when the assets are divided into asset
	// types instead of just being denoted as spot holdings.
	HasAssetTypeAccountSegregation bool `json:"hasAssetTypeAccountSegregation,omitempty"`
}

// TradingRequirements defines the requirements for trading on the exchange.
type TradingRequirements struct {
	// SpotMarketOrderAmountPurchaseQuotationOnly requires the amount to be in
	// quote currency or what is to be sold for when you purchase base currency.
	// For example, long BTC-USD, the quotation amount is USD.
	// NOTE: Due to an exchange's matching engine process, the base amount
	// acquired may vary from what is intended due to price fluctuations and
	// liquidity on the books. Care must be taken when implementing a market
	// neutral strategy.
	SpotMarketOrderAmountPurchaseQuotationOnly bool
	// SpotMarketOrderAmountSellBaseOnly requires the amount to be in the
	// base currency or what is intended to be purchased. For example, short
	// BTC-USD, the base amount is BTC.
	SpotMarketOrderAmountSellBaseOnly bool
	// ClientOrderID is a unique identifier for the order that is generated by
	// the client and is required for order submission.
	ClientOrderID bool
}
